package com.hw.quartzDemo.job;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

import static java.lang.System.out;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.swing.text.AbstractDocument.Content;
import javax.xml.crypto.Data;

/**
 * @author hewei<br>
 * Date 2018年9月10日<br>
 * <p>具体的被调度任务</p>
 */
public class HelloJob implements Job{

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		
		/*传给scheduler一个JobDetail实例，因为我们在创建JobDetail时，将要执行的job的类名传给了JobDetail，
		 * 所以scheduler就知道了要执行何种类型的job；
		 * 每次当scheduler执行job时，在调用其execute(…)方法之前会创建该类的一个新的实例；
		 * 执行完毕，对该实例的引用就被丢弃了，实例会被垃圾回收；
		 * 这种执行策略带来的一个后果是，job必须有一个无参的构造函数（当使用默认的JobFactory时）；
		 * 另一个后果是，在job类中，不应该定义有状态的数据属性，因为在job的多次执行中，这些属性的值不会保留。
		 * 那么如何给job实例增加属性或配置呢？如何在job的多次执行中，跟踪job的状态呢？答案就是:JobDataMap，JobDetail对象的一部分。*/
		
		/*在Job执行时，JobExecutionContext中的JobDataMap为我们提供了很多的便利。
		它是JobDetail中的JobDataMap和Trigger中的JobDataMap的并集，但是如果存在相同的数据，则后者会覆盖前者的值。*/
		
		JobKey key=context.getJobDetail().getKey();
		
		/*获得jobdetail的datamap数据
		JobDataMap map=context.getJobDetail().getJobDataMap();*/
		
		/*获得Trigger的datamap数据
		JobDataMap map=context.getTrigger().getJobDataMap();*/
		
//		获得jobDetail和Trigger合并的datamap数据
		JobDataMap map=context.getMergedJobDataMap();
		String author=map.getString("author");
		int age=map.getInt("age");
		List<String> info=(List<String>) map.get("info");
		
		Date date=new Date();
		SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateStr=sdf.format(date);
		out.println(dateStr+" | "+"Instance:"+key+" | author:"+author+" | age:"+age+" | info:"+info.toString());
	}

}
